package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import excepcion.DAOExcepcion;
import modelo.Categoria;
import modelo.Compra;
import modelo.Publicacion;
import modelo.Usuario;
import util.ConexionBD;

public class PublicacionDao extends BaseDAO {

	public Publicacion mostrarPublicacion(int codPublicacion)//Corregido
			throws DAOExcepcion {
		Publicacion pub = new Publicacion();
		Connection con = null;
		PreparedStatement stmt = null;
		PreparedStatement stmt2 = null;
		PreparedStatement stmt3 = null;
		ResultSet rs = null;
		ResultSet rs2 = null;
		ResultSet rs3 = null;

		try {
			String query = "select * from publicaciones where idpublicacion=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codPublicacion);
			rs = stmt.executeQuery();
			if (rs.next()) {
				Categoria cat = new Categoria();
				Usuario usuario = new Usuario();
				ArrayList<String> fotos = new ArrayList<String>();
				pub.setIdPublicacion(rs.getShort("idpublicacion"));
				pub.setTitulo(rs.getString("titulo"));
				pub.setDescripcion(rs.getString("descripcion"));
				pub.setEstado(rs.getString("estado"));
				pub.setCantidad(rs.getInt("cantidad"));
				pub.setPrecio(rs.getDouble("precio"));
				pub.setFechaCreacion(rs.getDate("fechacrear"));
				pub.setDuracion(rs.getInt("duracion"));
				pub.setPuntaje(rs.getInt("puntaje"));
				fotos.add(rs.getString("foto1"));
				fotos.add(rs.getString("foto2"));
				fotos.add(rs.getString("foto3"));
				pub.setFotos(fotos);
				try {
					int idCategoria = rs.getInt("categorias_idcategoria");
					query = "select * from categorias where idcategoria=?";
					stmt2 = con.prepareStatement(query);
					stmt2.setInt(1, idCategoria);
					rs2 = stmt2.executeQuery();
					if (rs2.next()) {
						cat.setIdcategoria(rs2.getInt("idcategoria"));
						cat.setNombre(rs2.getString("nombre"));
						cat.setDescripcion(rs2.getString("descripcion"));
						cat.setCategoria(cat);
					}
				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				}				
				pub.setCategoria(cat);
				try {
					String idUsuario = rs.getString("usuarios_usuario");
					usuario.setUser(idUsuario);
					query = "SELECT * FROM usuarios u, personas p " +
							"WHERE u.usuario = ? " +
							"AND u.personas_idpersona = p.idpersona";
					stmt3 = con.prepareStatement(query);
					stmt3.setString(1, idUsuario);
					rs3 = stmt3.executeQuery();
					if (rs3.next()) {
						usuario.setNombres(rs3.getString("nombres"));
						usuario.setPaterno(rs3.getString("paterno"));
						usuario.setMaterno(rs3.getString("materno"));						
					}
				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				}				
				//String nameuser = rs.getString("usuarios_usuario");				
				//usuario.setUser(nameuser);				
				pub.setUsuario(usuario);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarResultSet(rs2);
			this.cerrarStatement(stmt);
			this.cerrarStatement(stmt2);
			this.cerrarConexion(con);
		}
		return pub;
	}

	public ArrayList<Publicacion> mostrarMisVentas(String usuario)
			throws DAOExcepcion {
		ArrayList<Publicacion> miLista = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM publicaciones where usuarios_usuario = ? and estado = 'vendido'";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, usuario);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Usuario nameUser = new Usuario();
				Publicacion publicacion = new Publicacion();
				publicacion.setIdPublicacion(rs.getInt("idpublicacion"));
				publicacion.setTitulo(rs.getString("titulo"));
				publicacion.setDescripcion(rs.getString("descripcion"));
				publicacion.setEstado(rs.getString("estado"));
				publicacion.setCantidad(rs.getInt("cantidad"));
				publicacion.setPrecio(rs.getDouble("precio"));
				publicacion.setFechaCreacion(rs.getDate("fechacrear"));
				publicacion.setDuracion(rs.getInt("duracion"));
				publicacion.setPuntaje(rs.getInt("puntaje"));
				publicacion.setVenta(rs.getInt("venta"));
				nameUser.setUser(rs.getString("usuarios_usuario"));
				publicacion.setUsuario(nameUser);
				miLista.add(publicacion);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		return miLista;

	}

	public ArrayList<Compra> mostrarMisCompras(String usuario)
			throws DAOExcepcion {
		ArrayList<Compra> miLista = new ArrayList<Compra>();
		Connection con = null;
		PreparedStatement stmt = null;
		PreparedStatement stmt2 = null;
		ResultSet rs = null;
		ResultSet rs2 = null;
		try {
			String query = "SELECT * FROM compras where usuarios_usuario = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, usuario);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Publicacion pub = new Publicacion();
				Usuario nameUser = new Usuario();
				Compra compra = new Compra();
				compra.setIdCompra(rs.getInt("idcompra"));
				compra.setCantidad(rs.getInt("cantidad"));
				nameUser.setUser(rs.getString("usuarios_usuario"));
				compra.setUsuario(nameUser);
				try {
					int idPublicacion = rs
							.getInt("publicaciones_idpublicacion");
					query = "SELECT * FROM publicaciones where idpublicacion = ?";
					stmt2 = con.prepareStatement(query);
					stmt2.setInt(1, idPublicacion);
					rs2 = stmt2.executeQuery();
					if (rs2.next()) {
						pub.setIdPublicacion(rs2.getInt("idpublicacion"));
						pub.setTitulo(rs2.getString("titulo"));
						pub.setDescripcion(rs2.getString("descripcion"));
						pub.setEstado(rs2.getString("estado"));
						pub.setCantidad(rs2.getInt("cantidad"));
						pub.setPrecio(rs2.getDouble("precio"));
						pub.setFechaCreacion(rs2.getDate("fechacrear"));
						pub.setDuracion(rs2.getInt("duracion"));
						pub.setPuntaje(rs2.getInt("puntaje"));
						pub.setVenta(rs2.getInt("venta"));
					}
				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				}
				compra.setPublicacion(pub);
				miLista.add(compra);

			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarResultSet(rs2);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
			this.cerrarStatement(stmt2);
		}

		return miLista;

	}

	public ArrayList<Publicacion> listarPublicacionesRecomendadas()
			throws DAOExcepcion {
		String query = "SELECT p.`idpublicacion` , p.`titulo` , p.`descripcion` , p.`estado` , " +
				"p.`cantidad` , p.`precio` , p.`fechacrear` , p.`duracion` , p.`puntaje` , p.`venta` , " +
				"p.`foto1` , p.`foto2` , p.`foto3` , p.`usuarios_usuario` , c.`nombre` " +
				"FROM`publicaciones` p,`categorias` c " +
				"WHERE p.`categorias_idcategoria`= c.`idcategoria` " +
				"ORDER BY p.`puntaje`DESC " +
				"LIMIT 10";
		ArrayList<Publicacion> c = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		PreparedStatement stmt2 = null;
		ResultSet rs = null;
		ResultSet rs2 = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Publicacion publicacion = new Publicacion();
				Categoria categoria = new Categoria();
				Usuario usuario = new Usuario();
				ArrayList<String> s = new ArrayList<String>();
				publicacion.setIdPublicacion(rs.getInt("idpublicacion"));
				publicacion.setTitulo(rs.getString("titulo"));
				publicacion.setDescripcion(rs.getString("descripcion"));
				publicacion.setEstado(rs.getString("estado"));
				publicacion.setCantidad(rs.getInt("cantidad"));
				publicacion.setPrecio(rs.getDouble("precio"));
				publicacion.setFechaCreacion(rs.getDate("fechacrear"));
				publicacion.setDuracion(rs.getInt("duracion"));
				publicacion.setPuntaje(rs.getInt("puntaje"));
				publicacion.setVenta(rs.getInt("venta"));
				s.add(rs.getString("foto1"));
				s.add(rs.getString("foto2"));
				s.add(rs.getString("foto3"));
				publicacion.setFotos(s);
				categoria.setNombre(rs.getString("nombre"));
				publicacion.setCategoria(categoria);
				String nameuser = rs.getString("usuarios_usuario");
				usuario.setUser(nameuser);
				publicacion.setUsuario(usuario);
				c.add(publicacion);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarResultSet(rs2);
			this.cerrarStatement(stmt);
			this.cerrarStatement(stmt2);
			this.cerrarConexion(con);
		}
		return c;
	}

	public ArrayList<Publicacion> listarPublicacionesVendidas()
			throws DAOExcepcion {
		String query = "SELECT p.`idpublicacion` , p.`titulo` , p.`descripcion` , p.`estado` , " +
				"p.`cantidad` , p.`precio` , p.`fechacrear` , p.`duracion` , p.`puntaje` , p.`venta` , " +
				"p.`foto1` , p.`foto2` , p.`foto3` , p.`usuarios_usuario` , c.`nombre` " +
				"FROM`publicaciones` p,`categorias` c " +
				"WHERE p.`categorias_idcategoria`= c.`idcategoria` " +
				"ORDER BY p.`venta` DESC " +
				"limit 10";
		ArrayList<Publicacion> c = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		PreparedStatement stmt2 = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Publicacion publicacion = new Publicacion();
				Categoria categoria = new Categoria();
				Usuario usuario = new Usuario();
				ArrayList<String> s = new ArrayList<String>();
				publicacion.setIdPublicacion(rs.getInt("idpublicacion"));
				publicacion.setTitulo(rs.getString("titulo"));
				publicacion.setDescripcion(rs.getString("descripcion"));
				publicacion.setEstado(rs.getString("estado"));
				publicacion.setCantidad(rs.getInt("cantidad"));
				publicacion.setPrecio(rs.getDouble("precio"));
				publicacion.setFechaCreacion(rs.getDate("fechacrear"));
				publicacion.setDuracion(rs.getInt("duracion"));
				publicacion.setPuntaje(rs.getInt("puntaje"));
				publicacion.setVenta(rs.getInt("venta"));
				s.add(rs.getString("foto1"));
				s.add(rs.getString("foto2"));
				s.add(rs.getString("foto3"));
				publicacion.setFotos(s);
				categoria.setNombre(rs.getString("nombre"));
				publicacion.setCategoria(categoria);
				String nameuser = rs.getString("usuarios_usuario");
				usuario.setUser(nameuser);
				publicacion.setUsuario(usuario);
				c.add(publicacion);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarStatement(stmt2);
			this.cerrarConexion(con);
		}
		return c;
	}

	public int obtenerStockPublicacion(int idPublicacion) throws DAOExcepcion {
		int stock = 0;

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select cantidad from publicaciones where idpublicacion=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPublicacion);
			rs = stmt.executeQuery();
			if (rs.next()) {
				stock = rs.getInt("cantidad");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return stock;
	}

	public void procesarVenta(Compra compra, int stock) throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String mensaje = null;

		try {
			String query = "UPDATE publicaciones SET estado = 'vendido',cantidad = ? WHERE idpublicacion = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, stock);
			stmt.setInt(2, compra.getPublicacion().getIdPublicacion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				System.out.println("No se pudo editar publicacion");
				throw new SQLException(mensaje);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public String insertar(Publicacion publicacion) throws DAOExcepcion {

		String mensaje = null;
		String query = "insert into publicaciones(titulo, descripcion, estado, cantidad, "
				+ "precio, fechacrear, duracion, puntaje, venta, foto1, foto2, foto3, categorias_idcategoria, "
				+ "usuarios_usuario) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, publicacion.getTitulo());
			stmt.setString(2, publicacion.getDescripcion());
			stmt.setString(3, publicacion.getEstado());
			stmt.setInt(4, publicacion.getCantidad());
			stmt.setDouble(5, publicacion.getPrecio());
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			String fecha = sdf.format(publicacion.getFechaCreacion());
			stmt.setString(6, fecha);
			stmt.setInt(7, publicacion.getDuracion());
			stmt.setInt(8, publicacion.getPuntaje());
			stmt.setInt(9, publicacion.getVenta());
			stmt.setString(10, publicacion.getFoto1());
			stmt.setString(11, publicacion.getFoto1());
			stmt.setString(12, publicacion.getFoto1());
			stmt.setInt(13, publicacion.getCategoria().getIdcategoria());
			stmt.setString(14, publicacion.getUsuario().getUser());
			int i = stmt.executeUpdate();
			if (i != 1) {
				mensaje = "No se pudo insertar";
				throw new SQLException("No se pudo insertar");
			} else {
				mensaje = "Ok";
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} catch (Exception e) {
			System.err.print(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return mensaje;

	}

	public Publicacion obtener(int idPublicacion) throws DAOExcepcion {
		Publicacion vo = new Publicacion();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select * from publicaciones where idpublicacion=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPublicacion);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdPublicacion(rs.getInt("idpublicacion"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setEstado(rs.getString("estado"));
				vo.setCantidad(rs.getInt("cantidad"));
				vo.setPrecio(rs.getDouble("precio"));
				vo.setFechaCreacion(rs.getDate("fechacrear"));
				vo.setDuracion(rs.getInt("duracion"));
				vo.setPuntaje(rs.getInt("puntaje"));
				vo.setVenta(rs.getInt("venta"));
				vo.setFoto1(rs.getString("foto1"));
				vo.setFoto2(rs.getString("foto2"));
				vo.setFoto3(rs.getString("foto3"));
				Categoria categoria = new Categoria();
				categoria.setIdcategoria(rs.getInt("categorias_idcategoria"));
				vo.setCategoria(categoria);
				Usuario usuario = new Usuario();
				usuario.setUser(rs.getString("usuarios_usuario"));
				vo.setUsuario(usuario);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public int obtener_titulo_usuario(String Titulo, String Usuario)
			throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		int CantReg = 0;
		try {
			String query = "select count(*) as cant from publicaciones where titulo=? and usuarios_usuario=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, Titulo);
			stmt.setString(2, Usuario);
			System.out.println(Titulo);
			System.out.println(Usuario);
			rs = stmt.executeQuery();
			if (rs.next()) {
				CantReg = rs.getInt("cant");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return CantReg;
	}

	public ArrayList<Publicacion> buscarEnLasPublicaciones_dao(String Titulo,
			String Descrpcion) throws DAOExcepcion {
		String query = "select pub.idpublicacion, pub.titulo, pub.descripcion, pub.estado, pub.cantidad, pub.precio, pub.fechacrear, "
				+ "pub.duracion, pub.puntaje, pub.venta, pub.foto1, pub.foto2, pub.foto3, cat.nombre, "
				+ "concat(per.nombres, ' ', per.paterno) as nombres "
				+ "from publicaciones as pub "
				+ "inner join categorias as cat "
				+ "  on cat.idcategoria=pub.categorias_idcategoria "
				+ "inner join personas as per "
				+ "  on per.usuarios_usuario=pub.usuarios_usuario "
				+ "where pub.titulo = ? or pub.descripcion = ?";
		ArrayList<Publicacion> c = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		PreparedStatement stmt2 = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, Titulo);
			stmt.setString(2, Descrpcion);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Publicacion publicacion = new Publicacion();
				Categoria categoria = new Categoria();
				Usuario usuario = new Usuario();
				ArrayList<String> s = new ArrayList<String>();
				publicacion.setIdPublicacion(rs.getInt("idpublicacion"));
				publicacion.setTitulo(rs.getString("titulo"));
				publicacion.setDescripcion(rs.getString("descripcion"));
				publicacion.setEstado(rs.getString("estado"));
				publicacion.setCantidad(rs.getInt("cantidad"));
				publicacion.setPrecio(rs.getDouble("precio"));
				publicacion.setFechaCreacion(rs.getDate("fechacrear"));
				publicacion.setDuracion(rs.getInt("duracion"));
				publicacion.setPuntaje(rs.getInt("puntaje"));
				publicacion.setVenta(rs.getInt("venta"));
				s.add(rs.getString("foto1"));
				s.add(rs.getString("foto2"));
				s.add(rs.getString("foto3"));
				publicacion.setFotos(s);
				// categoria.setNombre(rs.getString("nombre"));
				// usuario.setNombres (rs.getString("nombres"));
				// System.out.println("Adicionando " + rs.getString("nombre"));
				//
				categoria.setIdcategoria(0);
				categoria.setNombre(rs.getString("nombre"));
				categoria.setDescripcion("");
				categoria.setCategoria(null);
				publicacion.setCategoria(categoria);
				//
				usuario.setUser(rs.getString("nombres"));
				publicacion.setUsuario(usuario);
				//
				/*
				 * try { int idCategoria = rs.getInt("categorias_idcategoria");
				 * query = "select * from categorias where idcategoria=?"; stmt2
				 * = con.prepareStatement(query); stmt2.setInt(1, idCategoria);
				 * rs2 = stmt2.executeQuery(); if (rs2.next()) {
				 * categoria.setIdcategoria(rs2.getInt("idcategoria"));
				 * categoria.setNombre(rs2.getString("nombre"));
				 * categoria.setDescripcion(rs2.getString("descripcion"));
				 * categoria.setCategoria(null); } } catch (SQLException e) {
				 * System.err.println(e.getMessage()); throw new
				 * DAOExcepcion(e.getMessage()); }
				 */
				/*
				 * publicacion.setCategoria(categoria); String nameuser =
				 * rs.getString("usuarios_usuario");
				 * usuario.setUsuario(nameuser);
				 * publicacion.setUsuario(usuario);
				 */
				c.add(publicacion);

			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarStatement(stmt2);
			this.cerrarConexion(con);
		}
		return c;
	}

}
